/*
 * Copyright (C) 2009 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.sugree.thairath.breakingnews;

import java.util.List;

import android.app.PendingIntent;
import android.app.Service;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.net.Uri;
import android.os.IBinder;
import android.text.format.Time;
import android.util.Log;
import android.widget.RemoteViews;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.sugree.thairath.breakingnews.entity.Message;
import com.sugree.thairath.breakingnews.FeedHelper.ApiException;
import com.sugree.thairath.breakingnews.FeedHelper.ParseException;

public class BreakingNewsWidget extends AppWidgetProvider {
	private static final String TAG = "BreakingNews";

	private static final String FEED_URL = "http://www.thairath.co.th/rss/news.xml";

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
            int[] appWidgetIds) {
        // To prevent any ANR timeouts, we perform the update in a service
        context.startService(new Intent(context, UpdateService.class));
    }

    public static class UpdateService extends Service {
		protected static int mItemIndex = 0;
		protected static List<Message> items = null;

        @Override
        public void onStart(Intent intent, int startId) {
			boolean isReload = intent.getBooleanExtra("reload", true);
			if (isReload || items == null) {
				reload(this);
				mItemIndex = 0;
			}

            RemoteViews updateViews = buildUpdate(this);
			mItemIndex = (mItemIndex+1)%items.size();

            ComponentName thisWidget = new ComponentName(this, BreakingNewsWidget.class);
            AppWidgetManager manager = AppWidgetManager.getInstance(this);
            manager.updateAppWidget(thisWidget, updateViews);
			stopSelf();
        }

		public void reload(Context context) {
            try {
                FeedHelper.prepareUserAgent(context);
                items = FeedHelper.getRSSContent(FEED_URL);
            } catch (ApiException e) {
                Log.e(TAG, "Couldn't contact API", e);
            } catch (ParseException e) {
                Log.e(TAG, "Couldn't parse API response", e);
            }
		}

        public RemoteViews buildUpdate(Context context) {
            RemoteViews updateViews = null;

			Message m = items.get(mItemIndex);
            updateViews = new RemoteViews(context.getPackageName(), R.layout.widget_news);
            updateViews.setTextViewText(R.id.title, m.getTitle());

        	Intent intent = new Intent(context, UpdateService.class);
			intent.putExtra("reload", false);
			PendingIntent pendingIntent = PendingIntent.getService(context, 0, intent, 0);
			updateViews.setOnClickPendingIntent(R.id.title, pendingIntent);

			intent = new Intent(Intent.ACTION_VIEW);
			intent.setData(Uri.parse(m.getLink()));
			pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
			updateViews.setOnClickPendingIntent(R.id.logo, pendingIntent);
            return updateViews;
        }

        @Override
        public IBinder onBind(Intent intent) {
            // We don't need to bind to this service
            return null;
        }
    }
}
